/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package transervfx.Vista;

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.beans.property.ReadOnlyBooleanProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Control;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import recursos.img.pathRecusosIMG;
import transervfx.Dato.Entidad.Localidad;
import transervfx.Dato.Entidad.LugarPersonalFrecuente;
import transervfx.Dato.Entidad.Pais;
import transervfx.Dato.Entidad.Provincia;
import transervfx.Dato.Validacion.ValidacionesNivelLogico;
import transervfx.Logica.GestorLugar;
import transervfx.Logica.GestorPais;
import transervfx.Vista.XML.pathRecusosFXML;
import utilidades.autocompletar.ComboBoxAutoCompletar;
import utilidades.autocompletar.TextBoxAutoCompletar;
import utilidades.number.IntegerTextField;

/**
 * FXML Controller class
 *
 * @author oscar
 */
public class CrearLugarPersonalFrecuente extends VentanaModal {

  
  
    @FXML
    private TextField calle;
    @FXML
    private IntegerTextField numero;
    @FXML
    private TextField departamento;
    @FXML
    private IntegerTextField piso;
    @FXML
    private TextBoxAutoCompletar<Localidad> localidad;
    @FXML
    private ComboBoxAutoCompletar<Provincia> provincia;
    @FXML
    private ComboBox<Pais> pais;
     final static private List listVacia=new ArrayList();

    private LugarPersonalFrecuente lugarView = new LugarPersonalFrecuente();
    private BeanPathAdapter<LugarPersonalFrecuente> lugarViewPA=new BeanPathAdapter<>(lugarView);
    
    ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
    Validator validator = validatorFactory.getValidator();

 
    public CrearLugarPersonalFrecuente(Stage ventanaPadre,String titulo,int x, int y) {
        super( ventanaPadre, titulo, x,  y);
        init();
    }
    
   
    public void init() {
        // TODO
        try {
            
           

            this.cargarPaicesProvinciasLocalidades();

            //linqueo interfaz con bean
            this.bindingInterfazConBean(lugarView);

            this.setFocos();
            
            

        } catch (NoSuchMethodException ex) {
            Logger.getLogger(CrearLugarPersonalFrecuente.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void salirEvent(ActionEvent event) {
        System.out.println(((Button) event.getSource()).getText());
        //root.getScene().getWindow().hide();
        this.close();
    }

    public void aceptarEvent() throws NoSuchMethodException, IOException {


     
        if (validar(this.calle) & validar(this.numero) & validar(this.departamento) & validar(this.piso) & validar(this.localidad.getTextField())) {

              ((ABMLugarPersonalFrecuente)this.ventanaPadre).actualizarTabla(this.lugarView);
       

           
            this.close();

        }
    }
    
        private ChangeListener<Boolean> escuchadorFoco=new ChangeListener<Boolean>() {
            public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
                //si tiene el foco
                Control control=(Control) ((ReadOnlyBooleanProperty)observable).getBean();
                if(!newValue.booleanValue()) 
                {  
                   
                 //   System.out.println("Foco viejo"+((ReadOnlyBooleanProperty)observable).getBean());
                    validar(control);

                }
            }
        };
    
    
      private boolean validar(Control control) {
          String text="";
          String nombreDelInput=control.getId();
          
          if(control==this.localidad.getTextField()){
              this.lugarView.setLocalidad(this.localidad.getValue());
          }
        
         
        
                control.getTooltip().setText(text);
                
                Set<ConstraintViolation<LugarPersonalFrecuente>> errorsProperty = validator.validateProperty(this.lugarView, nombreDelInput,ValidacionesNivelLogico.class);
                //retorna verdadero si no hay errores
                if(errorsProperty.isEmpty()){
       
                     control.getTooltip().setGraphic(crearImagenSuccess());
                     control.getTooltip().setText("SIN ERRORES");
                      control.setStyle("-fx-border-color: null;");
                      //System.out.println(control.getStyleClass());
                    return true;
                }
                else{
                      control.getTooltip().setGraphic(crearImagenError());
                      text="ERRORES: ";
                      control.setStyle("-fx-border-color: RED;");
                     // control.getStyleClass().clear();
                     // control.getStyleClass().add("controlError");
                for (ConstraintViolation<LugarPersonalFrecuente> lugarError : errorsProperty) {
                      text=text+"\n"+lugarError.getMessage();
                 }
                
                  control.getTooltip().setText(text);
              
                 //si no tiene errores retorna verdadero
                }
       
          
          return false;
    }
    
    

   
   

    private void bindingInterfazConBean(LugarPersonalFrecuente lugarView) throws NoSuchMethodException {
           lugarViewPA.bindBidirectional("calle", calle.textProperty());
           lugarViewPA.bindBidirectional("numero", numero.numberProperty());
           lugarViewPA.bindBidirectional("departamento", departamento.textProperty());
           lugarViewPA.bindBidirectional("piso", piso.numberProperty());
          

    }

    private void unbindingInterfazConBean(LugarPersonalFrecuente lugarView) {
        lugarView.unbindingALL();
    }

   

     private void cargarPaicesProvinciasLocalidades() {
      
          
         pais.setItems(FXCollections.observableArrayList(GestorPais.getInstance().paises()));
            
            
         provincia.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Provincia>() {

            @Override
            public void changed(ObservableValue<? extends Provincia> arg0, Provincia arg1, Provincia newValue) {
                if (newValue != null) {
                    localidad.setText("");
                    localidad.setData(GestorPais.getInstance().localidades(newValue));

                }  else{
                     localidad.setData(listVacia);
                }
            }
        });
                 
         pais.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Pais>() {

            @Override
            public void changed(ObservableValue<? extends Pais> arg0, Pais arg1, Pais arg2) {
                if (arg2 != null) {
                     provincia.setData(GestorPais.getInstance().provincias(arg2));
                }
              
            }
        });
         
         pais.getSelectionModel().select(0);
        provincia.getSelectionModel().select(0);
        
    }


    
    
       @Override
    URL getURLFXML() {
          return pathRecusosFXML.class.getResource("CrearLugarPersonalFrecuenteFXML.fxml");
    }
       
          private ImageView crearImagenSuccess() {
        Image image = new Image(pathRecusosIMG.class.getResourceAsStream("success.png"));
        
        return new ImageView(image);
    }

    private ImageView crearImagenError() {
        Image image = new Image(pathRecusosIMG.class.getResourceAsStream("error.png"));
        return new ImageView(image);
    }

    private void setFocos() {
        this.calle.focusedProperty().addListener(this.escuchadorFoco);
            this.departamento.focusedProperty().addListener(this.escuchadorFoco);
            this.piso.focusedProperty().addListener(this.escuchadorFoco);
            this.numero.focusedProperty().addListener(this.escuchadorFoco);
            this.localidad.getTextField().focusedProperty().addListener(this.escuchadorFoco);
    }
}
